package com.example.test.util;

import com.example.test.tree.TreeNode;
import lombok.experimental.UtilityClass;
import java.util.ArrayList;
import java.util.List;

/**
 * @Package: com.example.test.tree
 * @Author: Mr.Waves
 * @Date: 2020-04-01 17:43
 * @Description:
 **/
@UtilityClass
public class TreeUtil {

    /**
     * 方式一：两层循环（不含root两层）
     */
    public  <T extends TreeNode, N extends Number> List<T> sortByLoop(List<T> treeNodes, N rootId) {
        List<T> nodes = new ArrayList<>();
        for (T treeNode : treeNodes) {
            // 筛选第一层节点
            if (rootId.equals(treeNode.getPid())) {
                nodes.add(treeNode);
            }

            // 筛选当前节点的子节点
            for (T node : treeNodes) {
                if (treeNode.getId().equals(node.getPid())) {
                    treeNode.add(node);
                }
            }
        }
        return nodes;
    }

    /**
     * 方式二：递归（无限层）
     */
    public  <T extends TreeNode, N extends Number> List<T> sortByRecursion(List<T> treeNodes, N rootId) {
        List<T> nodes = new ArrayList<>();  // root下第一层
        for (T treeNode : treeNodes) {
            if (rootId.equals(treeNode.getPid())) {
                nodes.add(findChildren(treeNode, treeNodes));
            }
        }
        return nodes;
    }

    /**
     * 递归函数
     */
    public <T extends TreeNode> T findChildren(T treeNode, List<T> treeNodes) {
        for (T node : treeNodes) {
            if (treeNode.getId().equals(node.getPid())) {
                treeNode.add(findChildren(node,treeNodes));
            }
        }
        return treeNode;
    }
}
